 
    /** 
     * 文件名：StaticFactory.java 
     * 
     * 版本信息： 
     * 日期：2015年1月17日 
     * Copyright 足下 Corporation 2015 
     * 版权所有 
     * 
     */ 
    
package com.qyer.util.log.util;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;

 
    /** 
 * 此类描述的是： 静态工厂创建一个对象  静态工厂类产生的对象一般都有共同的特性，继承某一类，或者引用接口之类，在此 
 * 没有看似没有，但不可否认他们都是Object或者Object的一个子类 
 * @author: sunhongxi@58.com 
 * @version: 2015年1月17日 下午4:53:39 
 */

public class LogFatory {  
	static Map < String , Object> serviceMap= new HashMap<String , Object>();
	
    public static Object getInstance(String className){  
    	
    	if(className==null||"".equalsIgnoreCase(className)){
    		return null ;
    	}
    	
    	if(serviceMap==null){
    		serviceMap= new HashMap<String , Object>();
    	}
    	
    	if(serviceMap.get(className)!=null){
    		return serviceMap.get(className);
    	}
    	
        Object instance=null;  
        try {  
            Class cls=Class.forName(className);  
            instance= cls.newInstance();  
            serviceMap.put(className, instance);
            
        } catch (ClassNotFoundException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (InstantiationException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (IllegalAccessException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        return instance;  
          
    }  
    public static Object getInstance(String className,Object ...agrs) {  
    	if(className==null||"".equalsIgnoreCase(className)){
    		return null ;
    	}
    	
    	if(serviceMap==null){
    		serviceMap= new HashMap<String , Object>();
    	}
    	
    	if(serviceMap.get(className)!=null){
    		return serviceMap.get(className);
    	}
    	
        Class cls=null;  
        try {  
            cls = Class.forName(className);  
        } catch (ClassNotFoundException e1) {  
            // TODO Auto-generated catch block  
            return null;  
        }  
        Constructor[] constructors = cls.getConstructors();  
        Object instance=null;  
        for(Constructor cons:constructors){  
            Class <?>[] clses=cons.getParameterTypes();  
            if(clses.length>0){  
                boolean isThisConstructor=true;  
                for(int i=0;i<clses.length;i++){  
                    Class c=clses[i];   
                    if(! c.isInstance(agrs[i]) ){  
                        isThisConstructor=false;  
                    }  
                }  
                if(isThisConstructor){  
                    try {  
                        instance=cons.newInstance(agrs);  
                        serviceMap.put(className, instance);
                        break;  
                    } catch (IllegalArgumentException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    } catch (InvocationTargetException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    } catch (InstantiationException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    } catch (IllegalAccessException e) {  
                        // TODO Auto-generated catch block  
                        e.printStackTrace();  
                    }  
                }else{  
                    continue;  
                }  
                  
            }  
        }  
        return instance;  
    }  
}  
